package com.nidu.demo.i18n.util;

import cn.hutool.core.util.StrUtil;
import com.nidu.demo.i18n.service.I18nLocaleResolver;
import org.springframework.context.support.ResourceBundleMessageSource;

import java.nio.charset.StandardCharsets;
import java.util.Locale;

/**
 * 国际化工具类
 * 提供统一的国际化消息获取接口
 * 采用与WebUtils相同的设计模式
 * 
 * @author nidu
 */
public class I18nUtil {

    private static I18nLocaleResolver localeResolver;
    private static ResourceBundleMessageSource messageSource;

    /**
     * 构造函数，接收依赖并初始化静态资源
     * 
     * @param localeResolver 语言环境解析器
     * @param basename 消息资源基础名称
     */
    public I18nUtil(I18nLocaleResolver localeResolver, String basename) {
        I18nUtil.localeResolver = localeResolver;
        
        // 初始化MessageSource
        I18nUtil.messageSource = new ResourceBundleMessageSource();
        I18nUtil.messageSource.setDefaultEncoding(StandardCharsets.UTF_8.toString());
        I18nUtil.messageSource.setBasename(basename);
        I18nUtil.messageSource.setUseCodeAsDefaultMessage(true);
    }

    /**
     * 获取 国际化后内容信息
     *
     * @param code 国际化key
     * @return 国际化后内容信息
     */
    public static String getMessage(String code) {
        Locale locale = localeResolver.getLocal();
        return getMessage(code, null, code, locale);
    }

    /**
     * 获取 国际化后内容信息（带参数）
     *
     * @param code 国际化key
     * @param args 参数数组
     * @return 国际化后内容信息
     */
    public static String getMessage(String code, Object[] args) {
        Locale locale = localeResolver.getLocal();
        return getMessage(code, args, code, locale);
    }

    /**
     * 获取指定语言中的国际化信息，如果没有则走英文
     *
     * @param code 国际化 key
     * @param lang 语言参数
     * @return 国际化后内容信息
     */
    public static String getMessage(String code, String lang) {
        Locale locale;
        if (StrUtil.isEmpty(lang)) {
            locale = Locale.US;
        } else {
            try {
                String[] split = lang.split("-");
                locale = new Locale(split[0], split[1]);
            } catch (Exception e) {
                locale = Locale.US;
            }
        }
        return getMessage(code, null, code, locale);
    }

    /**
     * 获取国际化消息的核心方法
     * 
     * @param code 消息代码
     * @param args 参数数组
     * @param defaultMessage 默认消息
     * @param locale 语言环境
     * @return 国际化消息
     */
    public static String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
        if (messageSource == null) {
            return defaultMessage;
        }
        return messageSource.getMessage(code, args, defaultMessage, locale);
    }

}

